package com.yunhe.common.excel;

import com.yunhe.common.exception.ArgumentErrorException;
import com.yunhe.common.util.StringUtil;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.*;

import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 功能:POI工具方法
 * 作者: hetao
 * 版本: 1.0
 */
public class ExcelBase {

    //11111
    private final static String xls = "xls";
    private final static String xlsx = "xlsx";

    /**
     *
     * 方法说明：根据文件名,创建兼容xls和xlsx的Workbook
     *
     * Author：        tangjianye
     * Create Date：   2018年3月13日 下午2:30:53
     * History:  2018年3月13日 下午2:30:53   tangjianye   Created.
     *
     * @param is   文件流
     * @param fileName 文件名
     * @return  Workbook
     *
     */
    public static Workbook getWorkBook(InputStream is,String fileName) throws ArgumentErrorException {
        //创建Workbook工作薄对象，表示整个excel
        Workbook workbook = null;
        try {
            // 20190611 tjy 兼容两种格式
            workbook = WorkbookFactory.create(is);
        } catch (Exception ex) {
            throw new ArgumentErrorException("文件无法正常解析出工作薄对象");
        }
		/*try {
			// 根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
			if (fileName.endsWith(xls)) {
				// 2003
				workbook = new HSSFWorkbook(is);
			} else if (fileName.endsWith(xlsx)) {
				// 2007
				workbook = new XSSFWorkbook(is);
			} else {
				throw new BusinessException(ResultEnum.ERROR__FILE_TYPE,
						fileName);
			}
		} catch (Exception e) {

		} finally {
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}*/
        return workbook;
    }



    /**
     * 功能:获取单元格的值
     * @cell  单元格
     * @supplementErrMsg    sheet +  行 + 列 等信息,便于定位错误
     */
    public static String getCellValue(Cell cell) {
        Object result = "";
        if (cell == null) { return "";}
        // 注意：一定要设成这个，否则可能会出现乱码
        //cell.setEncoding(HSSFCell.ENCODING_UTF_16);
        switch (cell.getCellType()) {
            case STRING:
                result = cell.getStringCellValue();
                break;
            case NUMERIC:
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    Date date = cell.getDateCellValue();
                    if (date != null) {
                        result = new SimpleDateFormat("yyyy-MM-dd")
                                .format(date);
                    } else {
                        result = "";
                    }
                } else {
                    //经纬度要6位
                    result = new DecimalFormat("##.######").format(cell
                            .getNumericCellValue());
                }
                break;
            case FORMULA:
                cell.setCellType(CellType.FORMULA);
                result = cell.getStringCellValue();
                break;
            case BLANK:
                break;
            case ERROR:
                result = "";
                break;
            case BOOLEAN:
                result = (cell.getBooleanCellValue() == true ? "Y"
                        : "N");
                break;
            default:
                result = "";
        }

        return result.toString();
    }



    /**
     * 功能:获取单元格的值
     * @cell  单元格
     * @supplementErrMsg    sheet +  行 + 列 等信息,便于定位错误
     */
    public static String getCellValueBreak(Cell cell,String supplementErrMsg) throws ArgumentErrorException {
        try{
            return getCellValue(cell);
        }catch(Exception e){
            throw new ArgumentErrorException("单元格式无效"+supplementErrMsg);
        }

    }


    /**
     * 功能: 判断row是否是空行
     */
    public static boolean isBlankRow(Row row){
        if(row == null) {
            return true;
        }
        boolean result = true;
        for(int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++){
            Cell cell = row.getCell(i, Row.MissingCellPolicy.RETURN_BLANK_AS_NULL);
            String value = null;
            if(cell != null){
                switch (cell.getCellType()) {
                    case STRING:
                        value = cell.getStringCellValue();
                        break;
                    case NUMERIC:
                        value = String.valueOf((int) cell.getNumericCellValue());
                        break;
                    case BOOLEAN:
                        value = String.valueOf(cell.getBooleanCellValue());
                        break;
/*                case Cell.CELL_TYPE_FORMULA:
                   // value = String.valueOf(cell.getCellFormula());
                    break;*/
                    default:
                        break;
                }
                if(!StringUtil.isEmpty(value)){
                    result = false;
                    break;
                }
            }
        }
        return result;
    }



}